package org.xliu.cs.openproject.codegenerator.pojo;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 表示Java类
 */
public class JavaClass implements JavaElement {
    private final String className;
    private final List<JavaField> fields;
    // std::string
    private boolean hasStrings = false;
    // std::vector
    private boolean hasLists = false;
    private final Set<String> customTypes = new HashSet<>();

    public JavaClass(String className) {
        this.className = className;
        this.fields = new ArrayList<>();
    }

    public void addField(JavaField field) {
        fields.add(field);
        // 更新依赖信息
        updateDependencies(field);
    }

    /**
     * 更新依赖信息
     * @param field 字段
     */
    private void updateDependencies(JavaField field) {
        // 检查是否有字符串类型
        if (field.getType() != null && field.getType().equals("String")) {
            hasStrings = true;
        }
        
        // 检查是否有List类型
        if (field.isList()) {
            hasLists = true;
            // 对于List类型，如果元素是自定义类型，则需要包含该类型的头文件
            String elementCppType = field.getListElementCppType();
            if (JavaField.isCustomType(field.getCppType())) {
                customTypes.add(elementCppType);
            }
        }  else if (JavaField.isCustomType(field.getCppType())) {
            // 检查是否为自定义类类型（非List类型）
            customTypes.add(field.getCppType());
        }
    }

    // Getter方法
    public String getClassName() { return className; }
    public List<JavaField> getFields() { return fields; }
    public boolean isHasStrings() { return hasStrings; }
    public boolean isHasLists() { return hasLists; }
    public Set<String> getCustomTypes() { return customTypes; }

    @Override
    public String getName() {
        return className;
    }

    @Override
    public String getCppName() {
        return className;
    }
}